home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / QuickTime VR / MacOS / QuickDraw™ 3D 1.0.6F4 SDK / Development / 3DMF parser / 0.9 version / MFSTDCHK.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-24  |  3.9 KB  |  189 lines  |  [TEXT/MPS ]

  1. /*==============================================================================
  2.  *
  3.  *    File:        MFSTDCHK.C
  4.  *
  5.  *    Function:    Our MF3DProcs which interface to standard C routines.
  6.  *
  7.  *    Author(s):    Rick Wong (RWW)
  8.  *
  9.  *    Copyright:    (c) 1995 by Apple Computer, Inc., all rights reserved.
  10.  *
  11.  *    Change History (most recent first):
  12.  *        Fabio    Changed file name to 8 characters
  13.  *        F31_RWW    Avoid error when reading zero-size objects (binary).
  14.  *        F29_RWW    File created.
  15.  *==============================================================================
  16.  */
  17.  
  18. #include "MFSTDCHK.H"
  19.  
  20. #include <limits.h>
  21. #include <stdio.h>
  22.  
  23. #include "MFERRORS.H"
  24. #include "MFINT64.H"
  25.  
  26. MF3DErr
  27. MF3DStdCOpenHook(
  28.     MF3DDataFormatEnum    inDataFormat,
  29.     MF3DUserOpenDataPtr    inOpenDataPtr,
  30.     MF3DUserFilePtr *    outFilePtr)
  31. {
  32.     MF3DUserFilePtr        filePtr;
  33.     MF3DStdCOpenDataPtr    stdCOpenDataPtr;
  34.     MF3DErr                result;
  35.     char                *permissionString;
  36.  
  37.     stdCOpenDataPtr = (MF3DStdCOpenDataPtr)inOpenDataPtr;
  38.     if (MF3DIsTextFormat(inDataFormat))
  39.     {    if (stdCOpenDataPtr->permission == kMF3DStdCReadPerm)
  40.             permissionString = kMF3D_StdCTextReadPermStr;
  41.         else
  42.             permissionString = kMF3D_StdCTextWritePermStr;
  43.     }
  44.     else
  45.     {    if (stdCOpenDataPtr->permission == kMF3DStdCReadPerm)
  46.             permissionString = kMF3D_StdCBinaryReadPermStr;
  47.         else
  48.             permissionString = kMF3D_StdCBinaryWritePermStr;
  49.     }
  50.  
  51.     filePtr = (MF3DUserFilePtr)fopen(stdCOpenDataPtr->filename,
  52.             permissionString);
  53.  
  54.     if (filePtr != NULL)
  55.     {    result = kMF3DNoErr;
  56.         *outFilePtr = filePtr;
  57.     }
  58.     else
  59.     {    result = kMF3DErrFailedToOpen;
  60.     }
  61.  
  62.     return result;
  63. }
  64.  
  65. MF3DErr
  66. MF3DStdCReadHook(
  67.     MF3DUserFilePtr        inFilePtr,
  68.     MF3DSize            inCharsToRead,
  69.     char *                outBuffer)
  70. {
  71.     size_t    bytesRead;
  72.     MF3DErr    result;
  73.  
  74.     result = kMF3DNoErr;
  75.  
  76.     if (inCharsToRead > 0)
  77.     {    bytesRead = fread(outBuffer, sizeof(char), (size_t)inCharsToRead,
  78.                 (FILE *)inFilePtr);
  79.  
  80.         if (bytesRead == 0)
  81.         {    if (feof((FILE *)inFilePtr))
  82.                 result = kMF3DErrReadFailedEOF;
  83.             else
  84.                 result = kMF3DErrReadFailed;
  85.         }
  86.         else if (bytesRead != (size_t)inCharsToRead)
  87.         {    if (feof((FILE *)inFilePtr))
  88.                 result = kMF3DErrReadPartialEOF;
  89.             else
  90.                 result = kMF3DErrReadPartial;
  91.         }
  92.     }
  93.  
  94.     return result;
  95. }
  96.  
  97. MF3DErr
  98. MF3DStdCWriteHook(
  99.     MF3DUserFilePtr        inFilePtr,
  100.     MF3DSize            inCharsToWrite,
  101.     const char *        inBuffer)
  102. {
  103.     size_t    bytesWritten;
  104.     MF3DErr    result;
  105.  
  106.     result = kMF3DNoErr;
  107.     bytesWritten = fwrite(inBuffer, sizeof(char), (size_t)inCharsToWrite,
  108.             (FILE *)inFilePtr);
  109.  
  110.     if (bytesWritten == 0)
  111.     {    if (feof((FILE *)inFilePtr))
  112.             result = kMF3DErrWriteFailedEOF;
  113.         else
  114.             result = kMF3DErrWriteFailed;
  115.     }
  116.     else if (bytesWritten != (size_t)inCharsToWrite)
  117.     {    if (feof((FILE *)inFilePtr))
  118.             result = kMF3DErrWritePartialEOF;
  119.         else
  120.             result = kMF3DErrWritePartial;
  121.     }
  122.  
  123.     return result;
  124. }
  125.  
  126. MF3DErr
  127. MF3DStdCTellHook(
  128.     MF3DUserFilePtr                inFilePtr,
  129.     MF3DBinaryFilePosition *    outPositionPtr)
  130. {
  131.     long    filePosition;
  132.     MF3DErr    result;
  133.  
  134.     result = kMF3DNoErr;
  135.  
  136.     filePosition = ftell((FILE *)inFilePtr);
  137.     if (filePosition != -1L)
  138.     {    Int32ToInt64(filePosition, *outPositionPtr);
  139.     }
  140.     else
  141.     {    result = kMF3DErrTellFailed;
  142.     }
  143.  
  144.     return result;
  145. }
  146.  
  147. MF3DErr
  148. MF3DStdCSeekHook(
  149.     MF3DUserFilePtr            inFilePtr,
  150.     MF3DBinaryFilePosition    inPosition)
  151. {
  152.     MF3DErr                    result;
  153.     long                    longPos;
  154.     int                        fseekResult;
  155.     MF3DBinaryFilePosition    longMax;
  156.  
  157.     result = kMF3DNoErr;
  158.  
  159.     /*
  160.      * Standard C library only allows seeks in the range of a long.
  161.      * If you really want to seek farther, you will have to rewrite
  162.      * this yourself.
  163.      */
  164.     Int32ToInt64(LONG_MAX, longMax);
  165.     if (CompareInt64(inPosition, longMax) > 0)
  166.         result = kMF3DErrSeekOutOfRange;
  167.  
  168.     if (result == kMF3DNoErr)
  169.     {    Uns64ToUns32(inPosition, longPos);
  170.         fseekResult = fseek((FILE *)inFilePtr, longPos, SEEK_SET);
  171.     }
  172.  
  173.     if (fseekResult != 0)
  174.         result = kMF3DErrSeekFailed;
  175.  
  176.     return result;
  177. }
  178.  
  179. MF3DErr
  180. MF3DStdCCloseHook(
  181.     MF3DUserFilePtr        inFilePtr)
  182. {
  183.     int    closeResult;
  184.  
  185.     closeResult = fclose((FILE *)inFilePtr);
  186.  
  187.     return closeResult == 0 ? kMF3DNoErr : kMF3DErrCloseEOF;
  188. }
  189.